#include "objetscene.h"


//--------------------- Constructeurs et destructeur -------------------

/* ****************************************************************
 * Constructeur par défault
 * **************************************************************** */
ObjetScene::ObjetScene()
{
    _materiau = new Materiaux();
    _habillage = new HCouleur();
}

/* ****************************************************************
 * Constructeur avec une liste de faces
 * @param faces : les faces du nouvel objet
 * **************************************************************** */
ObjetScene::ObjetScene(QList<Face*>  faces)
    : _faces(faces)
{
    _materiau = new Materiaux();
    _habillage = new HCouleur();
}

/* ****************************************************************
 * Constructeur avec une liste de faces
 * @param faces : les faces du nouvel objet
 * @param habillage : l'habillage de la face
 * @param materiau : le materiau de la face
 * **************************************************************** */
ObjetScene::ObjetScene(QList<Face*>  faces, Habillage& habillage, Materiaux& materiau)
    : _faces(faces)
{
    _materiau = &materiau;
    _habillage = &habillage;
}

/* ****************************************************************
 * Constructeur avec une liste de faces
 * @param faces : les faces du nouvel objet
 * @param habillage : l'habillage de la face
 * @param materiau : le materiau de la face
 * **************************************************************** */
ObjetScene::ObjetScene(QList<Face*>  faces, Habillage& habillage, Materiaux& materiau, QList<Transformation*> transformations)
    : _faces(faces), _transformations(transformations)
{
    _materiau = &materiau;
    _habillage = &habillage;
}

/* ****************************************************************
 * Constructeur par recopie
 * @param objetScene : objet à recopier
 * **************************************************************** */
ObjetScene::ObjetScene(const ObjetScene& objetScene)
{
    for(int i = 0; i < objetScene._faces.size(); ++i)
    {
        this->_faces.push_back((new Face(*objetScene._faces[i])));
    }

    _materiau = objetScene._materiau;
    _habillage = objetScene._habillage;
    _transformations = objetScene._transformations;
}

/* ****************************************************************
 * Destructeur
 * **************************************************************** */
ObjetScene::~ObjetScene()
{
    //TODO : REPENSER aux destructions, peut être avec des  pointeurs intelligents
    //delete _materiau;

    for(int i = 0; i < _transformations.size(); ++i)
    {
        //delete _transformations[i];
    }

    for(int i = 0; i < _faces.size(); ++i)
    {
        //delete _faces[i];
    }

}

//----------------------------------------------------------------------
//--------------------- Méthodes ---------------------------------------

/* ****************************************************************
 * Fonction permettant d'ajouter une face
 * @param face : le face à rajouter
 * **************************************************************** */
void ObjetScene::ajouterFace(Face& face)
{
    _faces.push_back(&face);
}

/* ****************************************************************
 * Fonction permettant d'ajouter une transformation
 * @param transformation : la transformation à rajouter
 * **************************************************************** */
void ObjetScene::ajouterTransformation(Transformation& transformation)
{
    _transformations.push_back(&transformation);
}

/* ****************************************************************
 * Fonction permettant de récupérer le nombre de faces
 * @return int : le nombre de faces de l'objet
 * **************************************************************** */
int ObjetScene::getNbFaces()
{
    return _faces.size();
}

/* ****************************************************************
 * Fonction permettant de supprimer une face
 * @param i : indice de la face à supprimer
 * **************************************************************** */
void ObjetScene::supprimerFace(int i)
{
    if(i < 0 || i >= _faces.size())
    {
        throw std::string("ObjetScene.supprimerFace : erreur, l'indice i est hors limite.");
    }

    _faces.removeAt(i);
}

/* ****************************************************************
 * Fonction de dessin, on dessine les faces une par une
 * **************************************************************** */
void ObjetScene::dessiner()
{
    //On utilise le materiau
    _materiau->initialisation();

    //On utilise l'habillage
    _habillage->utiliser();

    //On effectue les transformations
    for(int i = 0; i < _transformations.size(); ++i)
    {
        _transformations[i]->utiliser();
    }

    //On dessine les faces
    for(int i = 0; i < _faces.size(); ++i)
    {
        _faces[i]->dessiner();
    }
}

//----------------------------------------------------------------------
//--------------------- Accesseurs -------------------------------------

/* ****************************************************************
 * Accesseur permettant de récupérer le matériaux de l'objet
 * @return Materiaux : le materiau de l'objet
 * **************************************************************** */
Materiaux& ObjetScene::getMateriau()
{
    return (*_materiau);
}

//----------------------------------------------------------------------
//--------------------- Surcharge des opérateurs -----------------------

//----------------------------------------------------------------------
